<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        console.log(Date.prototype, typeof Date.prototype); // Object 'object'

        function func () {

        }
        console.log(func.prototype); // Object -> 默认指向一个空的Object对象

        // 往空对象添加属性
        func.prototype.test =function () {
            console.log('test');
        }
        console.log(func.prototype);
    </script>

    <script>
        /**
         * 1. 每个函数function都有一个prototype, 即为显式原型
         * 2. 每个实例对象都有一个__proto__, 称为隐式原型
         * 3. 对象的隐式原型的值为其构造函数的显式原型的值
         */
        function Fn () { // 内部语句: this.prototype = {}

        }
        // 1. 每个函数function都有一个prototype, 即为显式原型
        console.log(Fn.prototype); // object

        // 2. 每个实例对象都有一个__proto__, 称为隐式原型
        let fn = new Fn(); // 内部语句: this.__proto__ = Fn.prototype
        console.log(fn.__proto__); // object

        // 3. 对象的隐式原型的值为其构造函数的显式原型的值
        console.log(Fn.prototype === fn.__proto__); // true

        // 给原型添加方法
        Fn.prototype.test = function () {
            console.log('test');
        }
        fn.test();
    </script>

    <script>
        /**
         * 原型链
         */
    </script>
</body>
</html>
